#include "key.h"

uint8_t getKey1(void),getKey2(void),getKey3(void),getKey4(void),getKey5(void),getKey6(void),getKey7(void),getKey8(void),
		getKey9(void),getKey10(void),getKey11(void),getKey12(void),getKey13(void),getKey14(void),getKey15(void),getKey16(void);

typedef uint8_t (*getKeyFunc)();

static getKeyFunc ReadKey[] = {getKey1,getKey2,getKey3,getKey4,getKey5,getKey6,getKey7,getKey8,
							getKey9,getKey10,getKey11,getKey12,getKey13,getKey14,getKey15,getKey16};
static uint16_t keyHeldTime[KEY_COUNT];
uint8_t keyEvent[KEY_COUNT];
/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
void Key_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);

  /*Configure GPIO pins : PC0 PC1 PC2 PC3 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pins : PA4 PA5 PA6 PA7 */
  GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

uint8_t getKey1() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_0);
}
uint8_t getKey2() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_1);
}
uint8_t getKey3() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_2);
}
uint8_t getKey4() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_3);
}

uint8_t getKey5() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_0);
}
uint8_t getKey6() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_1);
}
uint8_t getKey7() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_2);
}
uint8_t getKey8() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_3);
}

uint8_t getKey9() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_0);
}
uint8_t getKey10() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_1);
}
uint8_t getKey11() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_2);
}
uint8_t getKey12()
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_3);
}

uint8_t getKey13() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_0);
}
uint8_t getKey14() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_1);
}
uint8_t getKey15() 
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_2);
}
uint8_t getKey16()
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET);
	return !HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_3);
}

void keyScan(void)
{
	uint8_t i;
	for (i = 0; i < KEY_COUNT; i++)
	{
		if (ReadKey[i]())
		{
			keyHeldTime[i]++;
		}
		else
		{
			if (keyHeldTime[i] > 5)  //防抖
			{
				keyEvent[i] = 1;
			}
			keyHeldTime[i] = 0;
		}
	}
}

void clearKeyEvent(void)
{
	uint8_t i;
	for (i = 0; i < KEY_COUNT; i++)
	{
		keyEvent[i] = 0;
	}
}
